use deadpool_redis::{Config, Pool, Runtime};
use std::error::Error;
use crate::extends::core::config::framework::Redis;

/// `RedisManager` 结构体，用于管理Redis连接池的初始化。
#[derive(Debug)]
pub struct RedisManager;

impl RedisManager {
    /// 初始化Redis连接池。
    ///redis://kubernetes.docker.internal:36379/0
    /// # 参数
    /// - `config`: 包含Redis配置的结构体引用。
    ///
    /// # 返回
    /// 如果成功，返回一个Redis连接池`Pool`，否则返回一个错误`Box<dyn Error>`。
    pub async fn init_redis_pool(redis_config: &Redis) -> Result<Pool, Box<dyn Error>> {
        // 根据传入的配置设置Redis URL
        let redis_url = format!(
            "redis://{}:{}/{}",
            // 使用`unwrap_or_default`以防password为空
            redis_config.host.clone(),
            redis_config.port.clone(),
            // 确保database不为空
            redis_config.database.clone().unwrap_or_default()
        );
        // 创建默认的Redis配置
        let mut cfg = Config::from_url(redis_url);
        // 创建Redis连接池，使用Tokio运行时
        let pool = cfg.create_pool(Some(Runtime::Tokio1))?;
        // 返回连接池
        Ok(pool)
    }
}